﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Bussiness;
using Data;

namespace hostal
{
    public partial class RegistrarIngreso : Form
    {
        public string numeroHabitacion, fechaRegistro,numeroDocumento;
        string fechaLlegada, fechaSalida, fechaRegistroActual;
        private bool click = false;
        bool fechaIngresoIncorrecto, fechaSalidaIncorrecto,nuevo = true;
        private DataTable dataTableTemporal = new DataTable();
        private manejadorReservas habitacionesDisponibles = new manejadorReservas();
        private manejadorFechas fechas = new manejadorFechas();
        public List<string> coleccionHabitacionesDisponibles { get; set; }
        public List<string> coleccionCapacidadHabitacionesDisponibles { get; set; }
        public List<string> coleccionHabitaciones { get; set; }

        public RegistrarIngreso(string fechaLlegada, string numeroDocumento, string numeroHabitacion, string fechaSalida, List<string> coleccionHabitaciones)
        {
            InitializeComponent();
            nuevo = false;
            this.numeroDocumento = numeroDocumento;
            this.numeroHabitacion = numeroHabitacion;
            this.fechaRegistro = fechas.crearFechaActual();
            this.coleccionHabitaciones = coleccionHabitaciones;
            this.fechaLlegada = fechaLlegada;
            this.fechaSalida = fechaSalida;
            fechaRegistroActual = fechas.crearFechaActual();

            LBHabitacionReservada.Show();
            BTReservaPrevia.Hide();
            LBReservaPrevia.Hide();
            LBHabitacionReservada.Text += numeroHabitacion;
            DTFechaIngreso.Text = fechaLlegada;
            DTFechaSalida.Text = fechaSalida;

            habitacionDataAccess habitaciones = new habitacionDataAccess();
            dataTableTemporal = habitaciones.buscartipoHabitaciones();
            dg.DataSource = dataTableTemporal;
            for (int i = 0; i < dg.RowCount; i++)
            {
                CBTipoHabitacion.Items.Add(dg.Rows[i].Cells["tipo"].Value);
            }

            dataTableTemporal = habitaciones.obtenerTipoHabitacion(numeroHabitacion);
            CBTipoHabitacion.Text = dataTableTemporal.Rows[0][0].ToString();

            DGHabitacionesDisponibles.Columns.Add("numero", "numero habitacion");
            DGHabitacionesDisponibles.Columns.Add("tipo", "tipo");
            DGHabitacionesDisponibles.Columns.Add("capacidad", "capacidad");
            DGCliente.Columns.Add("numeroDocumento", "numero documento");
            DGCliente.Columns.Add("nombre", "nombre");
            DGCliente.Columns.Add("apellido", "apellido");

            llenarGridHabitacionesDisponibles2(fechaLlegada, fechaSalida);

            DGHabitacionesDisponibles.ClearSelection();
            for (int i = 0; i < DGHabitacionesDisponibles.Rows.Count; i++)
            {
                if (DGHabitacionesDisponibles.Rows[i].Cells["numero"].Value.ToString() == numeroHabitacion)
                    DGHabitacionesDisponibles.Rows[i].Cells["numero"].Selected = true;
            }

        }
        public RegistrarIngreso()
        {
            InitializeComponent();
            habitacionDataAccess habitaciones = new habitacionDataAccess();
            dataTableTemporal = habitaciones.buscartipoHabitaciones();
            dg.DataSource = dataTableTemporal;
            for (int i = 0; i < dg.RowCount; i++)
            {
                CBTipoHabitacion.Items.Add(dg.Rows[i].Cells["tipo"].Value);
            }
            CBTipoHabitacion.Text = CBTipoHabitacion.Items[0].ToString();

            DGHabitacionesDisponibles.Columns.Add("numero", "numero habitacion");
            DGHabitacionesDisponibles.Columns.Add("tipo", "tipo");
            DGHabitacionesDisponibles.Columns.Add("capacidad", "capacidad");
            DGCliente.Columns.Add("numeroDocumento", "numero documento");
            DGCliente.Columns.Add("nombre", "nombre");
            DGCliente.Columns.Add("apellido", "apellido");

            fechaRegistro = fechas.crearFechaActual();
            DTFechaIngreso.Text = fechaRegistro;
            DTFechaSalida.Text = fechaRegistro;

            llenarGridHabitacionesDisponibles(fechaRegistro, fechaRegistro);
        }

        private void BTFinalizar_Click(object sender, EventArgs e)
        {
            if (fechaIngresoIncorrecto = DTFechaIngreso.Value != System.DateTime.Today.Date)
                EPFechaIngreso.SetError(DTFechaIngreso, "La fecha de ingreso no puede ser distinta a la actual");
            else
                EPFechaIngreso.Clear();
            if (fechaSalidaIncorrecto = DTFechaIngreso.Value > DTFechaSalida.Value)
                EPFechaSalida.SetError(DTFechaSalida, "La fecha de salida no puede ser menor a la ingreso");
            else
                EPFechaSalida.Clear();
            if (!fechaSalidaIncorrecto && !fechaIngresoIncorrecto)
            {
                HospedajeDataAccess hospedaje = new HospedajeDataAccess();
                try
                {
                    int fila;
                    fila = DGCliente.CurrentRow.Index;

                    fila = DGHabitacionesDisponibles.CurrentRow.Index;
                    numeroHabitacion = DGHabitacionesDisponibles.Rows[fila].Cells["numero"].Value.ToString();
                    for (int i = 0; i < DGCliente.Rows.Count; i++)
                    {
                        numeroDocumento = DGCliente.Rows[i].Cells["numeroDocumento"].Value.ToString();
                        if (!hospedaje.existeHospedaje(numeroDocumento, numeroHabitacion, DTFechaIngreso.Text, fechaRegistro))
                            hospedaje.registrarHospedaje(numeroDocumento, numeroHabitacion, DTFechaIngreso.Text, DTFechaSalida.Text, fechaRegistro);
                        else
                            hospedaje.activarHospedaje(numeroDocumento, numeroHabitacion, DTFechaIngreso.Text, DTFechaSalida.Text, fechaRegistro, fechaRegistro);
                    }
                    MessageBox.Show("Exito Al Registrar");
                    if (!nuevo)
                    {
                        DialogResult = DialogResult.OK;
                    }
                    this.Close();
                }
                catch (SystemException exeption)
                {
                    if (DGCliente.Rows.Count == 0)
                        MessageBox.Show("Debe existir al menos una persona parta registrar");
                    else
                        MessageBox.Show("No se Registro Con Exito");
                }
            }
        }

        private void TBBuscarHabitacionesDisponibles_Click(object sender, EventArgs e)
        {
            if (DTFechaIngreso.Value.Date <= DTFechaSalida.Value.Date)
                if(nuevo)
                    llenarGridHabitacionesDisponibles(DTFechaIngreso.Text, DTFechaSalida.Text);
                else
                    llenarGridHabitacionesDisponibles2(DTFechaIngreso.Text, DTFechaSalida.Text);
            /*else
                MessageBox.Show("La fecha de salida no puede ser menor a la de ingreso");*/
        }

        private void llenarGridHabitacionesDisponibles(string fechaIngreso, string fechaSalida)
        {
            coleccionHabitacionesDisponibles = habitacionesDisponibles.obtenerHabitacionesDisponibles(fechaIngreso, fechaSalida, CBTipoHabitacion.Text);
            coleccionCapacidadHabitacionesDisponibles = habitacionesDisponibles.obtenerCapacidadHabitacionesDisponibles(fechaIngreso, fechaSalida, CBTipoHabitacion.Text);
            
            for (int i = 0; i < DGHabitacionesDisponibles.Rows.Count; )
            {
                DGHabitacionesDisponibles.Rows.Remove(DGHabitacionesDisponibles.Rows[0]);
            }
            for (int i = 0; i < coleccionHabitacionesDisponibles.Count(); i++)
            {
                DGHabitacionesDisponibles.Rows.Add(coleccionHabitacionesDisponibles[i], CBTipoHabitacion.Text,coleccionCapacidadHabitacionesDisponibles[i]);
            }
        }

        private void llenarGridHabitacionesDisponibles2(string fechaIngreso, string fechaSalida)
        {
            coleccionHabitacionesDisponibles = habitacionesDisponibles.obtenerHabitacionesDisponibles(fechaIngreso, fechaSalida, CBTipoHabitacion.Text);
            coleccionCapacidadHabitacionesDisponibles = habitacionesDisponibles.obtenerCapacidadHabitacionesDisponibles(fechaIngreso, fechaSalida, CBTipoHabitacion.Text);

            for (int i = 0; i < DGHabitacionesDisponibles.Rows.Count; )
            {
                DGHabitacionesDisponibles.Rows.Remove(DGHabitacionesDisponibles.Rows[0]);
            }
            for (int i = 0; i < coleccionHabitacionesDisponibles.Count(); i++)
            {
                if(/*!coleccionHabitaciones.Contains(coleccionHabitacionesDisponibles[i]) || */coleccionHabitacionesDisponibles[i]==numeroHabitacion)
                    DGHabitacionesDisponibles.Rows.Add(coleccionHabitacionesDisponibles[i], CBTipoHabitacion.Text, coleccionCapacidadHabitacionesDisponibles[i]);
            }
        }

        private void llenarGridClientes()
        {

        }

        private void BTBuscarCliente_Click(object sender, EventArgs e)
        {
            BuscarClienteReserva buscarClienteReserva = new BuscarClienteReserva();
            bool registrar=false;
            if (buscarClienteReserva.ShowDialog() == DialogResult.OK)
            {
                for (int i = 0; i < DGCliente.Rows.Count; i++)
                {
                    if(registrar=DGCliente.Rows[i].Cells["numeroDocumento"].Value.ToString()==buscarClienteReserva.numeroDocumento)
                        i=DGCliente.Rows.Count;
                }
                if(!registrar)
                    DGCliente.Rows.Add(buscarClienteReserva.numeroDocumento, buscarClienteReserva.nombre, buscarClienteReserva.apellido);
            }
        }

        private void BTAgregarHuesped_Click(object sender, EventArgs e)
        {
            registarCliente registrarClienteReserva = new registarCliente();
            registrarClienteReserva.ShowDialog();
        }

        private void BTEliminarHuesped_Click(object sender, EventArgs e)
        {
            try
            {
                DGCliente.Rows.Remove(DGCliente.CurrentRow);
            }
            catch (Exception exp) { }
        }

        private void BTAtras_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void DTFechaIngreso_CloseUp(object sender, EventArgs e)
        {
            TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

        private void DTFechaSalida_CloseUp(object sender, EventArgs e)
        {
            TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

        private void CBTipoHabitacion_SelectionChangeCommitted(object sender, EventArgs e)
        {
            click=true;
        }

        private void CBTipoHabitacion_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = true;
        }

        private void CBTipoHabitacion_SelectedValueChanged(object sender, EventArgs e)
        {
            if(click)
                TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

        private void BTReservaPrevia_Click(object sender, EventArgs e)
        {
            /*BuscarReserva ingresoReserva = new BuscarReserva("registro");
            ingresoReserva.ShowDialog();*/
            BuscarReserva ingresoReserva = new BuscarReserva("registro");
            callFormsChild(ingresoReserva);
        }
        private void callFormsChild(Form form)
        {
            form.MdiParent = this.MdiParent;
            form.Show();
            this.Close();
        }

        private void DTFechaIngreso_ValueChanged(object sender, EventArgs e)
        {
            TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

        private void DTFechaSalida_ValueChanged(object sender, EventArgs e)
        {
            TBBuscarHabitacionesDisponibles_Click(sender, e);
        }
    }
}
